import org.junit.jupiter.api.Test;

import java.time.*;
import java.time.format.DateTimeFormatter;

/**
 * @author xufeng
 * @date 2023-04-27
 */
public class YearMonthDemo {
}

class YearMonthDemo01{

    /**
     * from(TemporalAccessor temporal)
     * 作用：从其他含有年月数据的时间对象中获取yearMonth对象。
     */
    @Test
    public void test01(){
        LocalDate date01 = LocalDate.parse("2023-01-01");
        System.out.println(YearMonth.from(date01)); // 输出 2023-01
    }

    /**
     * now()
     * 作用：从操作系统获取年月数据。
     *
     * now(ZoneId zone)
     * 作用：获取某个时区此刻的年月数据。
     *
     * now(Clock clock)
     * 作用：从clock对象获取年月数据。clock对象有时区的概念，所以获取的是跟地区相关的数据。
     */
    @Test
    public void test02(){
        YearMonth yearMonth01 = YearMonth.now();
        System.out.println(yearMonth01); // 输出 2023-05

        ZoneId zoneId01 = ZoneId.of("-18:00");
        YearMonth yearMonth02 = YearMonth.now(zoneId01);
        System.out.println(yearMonth02); // 输出 2023-05

        Instant instant01 = Instant.parse("2023-04-01T05:00:00Z");
        ZoneId zoneId02 = ZoneId.of("America/Los_Angeles");
        Clock fixedClock01 = Clock.fixed(instant01, zoneId02);
        YearMonth yearMonth03 = YearMonth.now(fixedClock01);
        System.out.println(yearMonth03); // 输出 2023-03
    }

    /**
     * of(int year, int month)
     * of(int year, Month month)
     * 作用：给定年月数据创建yearMonth对象。
     */
    @Test
    public void test03(){
        System.out.println(YearMonth.of(2023, 1)); // 输出 2023-01
        System.out.println(YearMonth.of(2023, Month.JANUARY)); // 输出 2023-01
    }

    /**
     * parse(CharSequence text)
     * parse(CharSequence text, DateTimeFormatter formatter)
     * 作用：将字符串解析成yearMonth对象，默认格式yyyy-MM，formatter指定字符串的格式。
     */
    @Test
    public void test04(){
        System.out.println(YearMonth.parse("2023-01")); // 输出 2023-01

        DateTimeFormatter df01 = DateTimeFormatter.ofPattern("yyyy年MM日");
        System.out.println(YearMonth.parse("2023年01日", df01)); // 输出 2023-01
    }
}

class YearMonthDemo02{

    /**
     * atDay(int dayOfMonth)
     * atEndOfMonth()
     * 作用：补充日期数据创建localDate对象。
     */
    @Test
    public void test01(){
        YearMonth yearMonth01 = YearMonth.parse("2023-01");
        LocalDate date01 = yearMonth01.atDay(1);
        System.out.println(date01); // 输出 2023-01-01

        LocalDate date02 = yearMonth01.atEndOfMonth();
        System.out.println(date02); // 输出 2023-01-31
    }

    /**
     * isLeapYear()
     * 作用：判断该年份是否时闰年。
     *
     * isValidDay(int dayOfMonth)
     * 作用：判断日数据是否合法。
     */
    @Test
    public void test02(){
        YearMonth yearMonth01 = YearMonth.parse("2000-02");
        YearMonth yearMonth02 = YearMonth.parse("2023-02");
        System.out.println(yearMonth01.isLeapYear()); // 输出 true
        System.out.println(yearMonth02.isLeapYear()); // 输出 false

        System.out.println(yearMonth01.isValidDay(29)); // 输出 true
        System.out.println(yearMonth02.isValidDay(29)); // 输出 false
    }

    /**
     * lengthOfMonth()
     * 作用：获取月份天数。
     *
     * lengthOfYear()
     * 作用：获取年份天数。
     */
    @Test
    public void test03(){
        YearMonth yearMonth01 = YearMonth.parse("2000-02");
        YearMonth yearMonth02 = YearMonth.parse("2023-02");
        System.out.println(yearMonth01.lengthOfMonth());// 输出 29
        System.out.println(yearMonth02.lengthOfMonth());// 输出 28

        System.out.println(yearMonth01.lengthOfYear());// 输出 366
        System.out.println(yearMonth02.lengthOfYear());// 输出 365
    }
}